package com.fdb.efp.batch.service.impl.dw;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.efp.batch.common.constant.BdLoanConstant;
import com.fdb.efp.batch.service.domain.TxtFileLoadBean;
import com.fdb.efp.batch.service.domain.dw.DwBaiduLoanRateBean;
import com.fdb.efp.batch.service.facade.dw.DwFeeRateBatchService;
import com.fdb.efp.batch.service.util.DueDataUtil;
import com.fdb.efp.batch.service.util.SDicMappingUtil;
import com.fdb.efp.batch.service.util.TxtFileLoadPlugin;
import com.fdb.efp.loan.service.facade.AccoutErroTempService;
import com.fdb.efp.loan.service.facade.BdFeeRateService;
import com.fdb.efp.loan.service.facade.DwBaiduLoanRateTempService;
import com.fdb.efp.loan.service.vo.AccoutErroTempVO;
import com.fdb.efp.loan.service.vo.BdFeeRateVO;
import com.fdb.efp.loan.service.vo.DwBaiduLoanRateTempVO;

/**
 * 
 * 根据百度同步过来的贷款利息汇率临时表数据修改费率表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午3:18:50
 * @version 1.0
 */
@Service("dwFeeRateBatchService")
public class DwFeeRateBatchServiceImpl implements DwFeeRateBatchService, FrameworkService {

	private static Logger logger = LoggerFactory.getLogger(DwFeeRateBatchServiceImpl.class);

	@Autowired
	@Qualifier("dwBaiduLoanRateTempService")
	private DwBaiduLoanRateTempService dwBaiduLoanRateTempService;// 贷款利息汇率临时信息

	@Autowired
	@Qualifier("bdFeeRateService")
	private BdFeeRateService bdFeeRateService;// 费率信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	// /**
	// *
	// * 根据存量的贷款利息汇率临时表数据修改费率表 <br>
	// * 0.1:ludayong:2019年5月13日 上午9:08:10:新增 <br>
	// *
	// * @author ludayong
	// * @since 2019年5月13日 上午9:08:10
	// * @date 2019年5月13日 上午9:08:10
	// * @version 0.1
	// */
	// @SuppressWarnings("unchecked")
	// @Override
	// public boolean batchSyncFeeRate(String fileUrl) throws Exception {
	// boolean result = false;
	// long startTime = System.currentTimeMillis();
	// logger.info("同步存量的贷款利息汇率临时表数据到费率表：[" + DateTool.formatDate(new
	// Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
	// // 可以配置参数
	// Integer pageSize = 1000;
	// try {
	// // 需要新增或者修改的费率信息
	// List<DwBaiduLoanRateTempVO> list = null;
	// // 分页信息
	// DwBaiduLoanRateTempVO pageInfo = new DwBaiduLoanRateTempVO();
	// // 新增或者修改的费率信息数量
	// int num = 0;
	// // 页数
	// int page = 1;
	// // pageSize初始化
	// if (pageSize > 0) {
	// pageInfo.setSize(pageSize);
	// } else {
	// pageInfo.setSize(1000);
	// }
	// // 判断循环次数
	// int size = dwBaiduLoanRateTempService.queryCount();
	// String size_msg = "【贷款利息汇率临时表】数据量：" + size;
	// logger.info(size_msg, "message{}");
	// int loopCount = (size / pageInfo.getSize()) + 1;
	//
	// for (int i = 0; i < loopCount; i++) {
	// String page_msg = "【贷款利息汇率临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" +
	// pageInfo.getSize();
	// logger.info(page_msg, "message{}");
	// // 分页查询【贷款利息汇率临时表】数据
	// List<DwBaiduLoanRateTempVO> tempList =
	// dwBaiduLoanRateTempService.queryByPage(pageInfo);
	// list = new ArrayList<DwBaiduLoanRateTempVO>();
	// if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
	// try {
	// for (DwBaiduLoanRateTempVO dwBaiduLoanRateTempVO : tempList) {
	// // 需要新增或者更新的费率信息
	// dwBaiduLoanRateTempVO = initBdFeeRateInfo(dwBaiduLoanRateTempVO);
	// if (Objects.nonNull(dwBaiduLoanRateTempVO)) {
	// // 需要新增或者更新的费率信息
	// list.add(dwBaiduLoanRateTempVO);
	// }
	// }
	// // 需要新增或者更新的费率信息
	// if (Objects.nonNull(list) && !list.isEmpty()) {
	// List<BdFeeRateVO> bdFeeRatelList = new ArrayList<BdFeeRateVO>();
	// bdFeeRatelList = (List<BdFeeRateVO>) beansCopy(list, BdFeeRateVO.class);
	// int nlsCreditInfoInsOrUpdNum =
	// bdFeeRateService.insertOrUpdateBdFeeRate(bdFeeRatelList);
	// if (nlsCreditInfoInsOrUpdNum < 1) {
	// throw new BizException("新增或者更新费率信息表出错，分页页数：" + page);
	// }
	// num += nlsCreditInfoInsOrUpdNum;
	// }
	// } catch (Exception e) {
	// e.printStackTrace();
	// String tableName = "bd_fee_rate";
	// String remark = "新增或者更新费率信息表出错，分页页数：" + page;
	// String errorMsg = "新增或者更新费率信息表出错，异常信息：" + e.getMessage();
	// logger.error(errorMsg);
	// // 记录异常信息
	// this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// remark);
	// }
	// }
	// pageInfo.setPage(++page);
	// }
	// String num_msg = "【费率表】插入或更新数据处理结果:" + num;
	// logger.info(num_msg, "message{}");
	// result = true;
	// } catch (Exception e) {
	// e.printStackTrace();
	// String tableName = "bd_fee_rate";
	// String errorMsg = "同步存量的贷款利息汇率临时表数据到费率表出错";
	// String remark = "同步存量的贷款利息汇率临时表数据到费率表出错，错误信息：" + e.getMessage();
	// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// remark);
	// logger.error(remark);
	// throw new Exception(remark);
	// }
	// long endTime = System.currentTimeMillis();
	// logger.info("同步存量的贷款利息汇率临时表数据到费率表：[" + DateTool.formatDate(new Date(endTime),
	// DateTool.PATTERN_DATETIME) + "]， 处理结束");
	// logger.info("同步存量的贷款利息汇率临时表数据到费率表，耗时：[" + (endTime - startTime) / 1000.0 +
	// "]秒，处理结果[" + result + "]");
	// return result;
	// }

	/**
	 * 
	 * 根据存量的贷款利息汇率文件数据修改费率表 <br>
	 * 0.1:ludayong:2019年5月13日 上午9:08:10:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:08:10
	 * @date 2019年5月13日 上午9:08:10
	 * @version 0.1
	 */
	@Override
	public boolean batchSyncFeeRate(String fileUrl) throws Exception {
		// 处理结果
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步存量的贷款利息汇率临时表数据到费率表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		try {
			TxtFileLoadPlugin txtFileLoadPlugin = new TxtFileLoadPlugin(fileUrl, "\u0002", "UTF-8", 0, 1000);
			List<TxtFileLoadBean> txtFileLoadList = txtFileLoadPlugin.run(new DwBaiduLoanRateBean());
			result = dueData(txtFileLoadList);
			if (txtFileLoadList.size() != 0) {
				while (!txtFileLoadList.get(txtFileLoadList.size() - 1).isReadedComplete) {
					txtFileLoadPlugin.setFirstRead(false);
					txtFileLoadList = txtFileLoadPlugin.run(new DwBaiduLoanRateBean());
					if (txtFileLoadList.size() == 0) {
						break;
					}
					result = dueData(txtFileLoadList);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_fee_rate";
			String errorMsg = "同步存量的贷款利息汇率临时表数据到费率表出错";
			String remark = "同步存量的贷款利息汇率临时表数据到费率表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步存量的贷款利息汇率临时表数据到费率表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步存量的贷款利息汇率临时表数据到费率表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据存量的贷款利息汇率文件数据加工初始化费率信息 <br>
	 * 0.1:ludayong:2019年5月13日 上午9:08:10:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:08:10
	 * @date 2019年5月13日 上午9:08:10
	 * @version 0.1
	 */
	@SuppressWarnings("unchecked")
	public boolean dueData(List<TxtFileLoadBean> txtFileLoadList) {
		logger.info("同步存量的贷款利息汇率临时表数据到费率表加工处理开始！");
		// 需要新增或者修改的费率信息
		List<DwBaiduLoanRateTempVO> list = new ArrayList<DwBaiduLoanRateTempVO>();
		// 处理结果
		boolean result = false;
		// 新增或者修改的数量
		int num = 0;
		DwBaiduLoanRateBean dwBaiduLoanRateBean = new DwBaiduLoanRateBean();
		try {
			for (int i = 0; i < txtFileLoadList.size(); i++) {
				dwBaiduLoanRateBean = (DwBaiduLoanRateBean) txtFileLoadList.get(i);
				// 需要新增或者更新的费率信息
				DwBaiduLoanRateTempVO dwBaiduLoanRateTempVO = initBdFeeRateInfo(dwBaiduLoanRateBean);
				if (Objects.nonNull(dwBaiduLoanRateTempVO)) {
					// 需要新增或者更新的费率信息
					list.add(dwBaiduLoanRateTempVO);
				}
			}
			if (list != null && !list.isEmpty()) {
				List<BdFeeRateVO> bdFeeRatelList = new ArrayList<BdFeeRateVO>();
				bdFeeRatelList = (List<BdFeeRateVO>) beansCopy(list, BdFeeRateVO.class);
				num = bdFeeRateService.insertOrUpdateBdFeeRate(bdFeeRatelList);
			}
			String num_msg = "【费率表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			if (num > 0) {
				result = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_fee_rate";
			String errorMsg = "同步存量的贷款利息汇率临时表数据到费率表出错";
			String remark = "同步存量的贷款利息汇率临时表数据到费率表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			// 清空信息
			list = null;
			txtFileLoadList = null;
		}
		logger.info("同步存量的贷款利息汇率临时表数据到费率表加工处理结束！");
		return result;
	}

	/**
	 * 
	 * 初始化费率正式表信息 <br>
	 * 0.1:ludayong:2019年5月13日 上午11:40:18:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午11:40:18
	 * @date 2019年5月13日 上午11:40:18
	 * @version 0.1
	 */
	public DwBaiduLoanRateTempVO initBdFeeRateInfo(DwBaiduLoanRateBean dwBaiduLoanRateBean) {
		DwBaiduLoanRateTempVO dwBaiduLoanRateTempVO = new DwBaiduLoanRateTempVO();
		try {
			beanCopy(dwBaiduLoanRateBean, dwBaiduLoanRateTempVO);
			// 单位转换
			final int oneHundred100 = 100;
			// 单位转换
			final int oneHundred10000 = 10000;
			// int_rate 正常利率 万分之
			dwBaiduLoanRateTempVO.setIntRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getIntRate(), oneHundred10000));
			// ovd_rate 罚息利率 万分之
			dwBaiduLoanRateTempVO.setOvdRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getOvdRate(), oneHundred10000));
			// fund_fee_ratio 借款服务费率 Number 百分之
			dwBaiduLoanRateTempVO.setFundFeeRatio(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getFundFeeRatio(), oneHundred100));
			// fund_fee_max 借款服务费上限金额 Number 分
			dwBaiduLoanRateTempVO.setFundFeeMax(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getFundFeeMax(), oneHundred100));
			// fund_fee_min 借款服务费下限金额 Number 分
			dwBaiduLoanRateTempVO.setFundFeeMin(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getFundFeeMin(), oneHundred100));
			// charges_rate 分期手续费率 Number 百分之
			dwBaiduLoanRateTempVO.setChargesRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getChargesRate(), oneHundred100));
			// overdue_rate 逾期费率 Number 百分之
			dwBaiduLoanRateTempVO.setOverdueRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getOverdueRate(), oneHundred100));
			// repay_violate_rate 提前还款违约金费率 Number 百分之
			dwBaiduLoanRateTempVO
					.setRepayViolateRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getRepayViolateRate(), oneHundred100));
			// refund_violate_rate 退款违约金费率 Number 百分之
			dwBaiduLoanRateTempVO
					.setRefundViolateRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getRefundViolateRate(), oneHundred100));
			// service_rate 担保费费率 Number 百分之
			dwBaiduLoanRateTempVO.setServiceRate(DueDataUtil.checkDecimalInfo(dwBaiduLoanRateTempVO.getServiceRate(), oneHundred100));
			// cur_date 账务日期 cur_date 账务日期:对账日期（T日）
			dwBaiduLoanRateTempVO.setCurDate(DueDataUtil.dateInfoTrans(dwBaiduLoanRateTempVO.getCurDate()));
			// prd_code 产品代码
			dwBaiduLoanRateTempVO.setPrdCode(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, dwBaiduLoanRateTempVO.getProdtp()));
			// create_time 创建时间
			dwBaiduLoanRateTempVO.setCreateTime(DueDataUtil.getCreateTimeValue(dwBaiduLoanRateTempVO.getEtlDate()));
			// last_modify_time 最近修改时间
			dwBaiduLoanRateTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
			return dwBaiduLoanRateTempVO;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_fee_rate";
			String remark = "初始费率信息出错，借据号：" + dwBaiduLoanRateTempVO.getLoanId();
			String errorMsg = "初始费率信息出错，异常信息：" + e.getMessage();
			logger.error(errorMsg);
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			return null;
		}
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年5月13日 上午9:25:49:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:25:49
	 * @date 2019年5月13日 上午9:25:49
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
